iT邦幫忙

2025 iThome 鐵人賽

DAY 18
1
AI & Data

動不動就要 ETL? 以Trino為例-淺談從資料倉儲到湖倉系列 第 18

Day 18 - 冰山不止一角,Iceberg 與 S3 (二)

  • 分享至 

  • xImage
  •  

18

「目錄」與「時光機」

manifestsnapshot 就像 Iceberg 的「目錄」與「時光機」,分別負責掌管檔案的組織結構,以及資料在不同時間點的全貌。

首先談談 manifest 的用途,他還可幫助 查詢引擎 進行:

  • *條件下推 (Predicate Pushdown):根據 欄位統計值(min/max/null count)預判是否需載入某個 實體資料檔案 (data file)。
  • *分區裁剪 (Partition Pruning):根據 manifest 中的分區 (partition) 決定是否讀取某個 實體資料檔案 (data file),避免非必要掃描。

*條件下推 (Predicate Pushdown):指使查詢條件(如 WHERE age > 30)被「下推」
至儲存層來做早期過濾,而不是等資料全讀進來才篩選。

*分區裁剪 (Partition Pruning):當表格是依某欄位做 partition(分區)時
查詢條件中若有使用該欄位,就可以只讀取符合的分區,跳過其他無關分區的資料。

再說下 snapshot 的用途,透過保存各時點的快照檔可以做到:

  • 🕒 Time Travel:透過指定 snapshot ID / timestamp 查詢歷史資料狀態。
  • 🔄 Rollback:發現資料有問題時可快速回復到舊版本。
  • ✅ ACID 實作:Insert / Delete / Update 都是透過新建 snapshot 完成,且檔案不可變更,可確保 原子性 與 隔離性。
  • 🧬 Lineage 建構:可追蹤某筆資料何時、被誰寫入,並進行血緣分析。

那到底 snapshot 快照檔與 manifest 是如何對應的呢?

答案是,每個 snapshot 對應一或多個 manifest listmanifest-list-xxx.avro),每個 manifest list 又指向多個 manifest,如下圖:

snapshot 與 manifest 對應關係

這樣最終就會指到實體資料的位置,構建出完整的索引系統。

# snapshot to data files
Snapshot
  └── Manifest List(manifest-list-xxx.avro)
        └── Manifest Files(manifest-xxx.avro)
              └── Data Files(data/*.parquet)

Iceberg 之於資料湖倉

使用 S3 實際說明了 Iceberg 的特性後,是時候拉回正題,也就是到底要如何在資料湖倉上發揮 Iceberg 的好處呢?

說到這需回顧系列文 — 《效能跟一致性? 資料湖倉全都要!》內提到資料湖倉解決的資料倉儲痛點,包含:

  1. 資料重複存放:透過 Iceberg metadata 使不同搜尋引擎可同時查詢解決此問題,不必再將資料湖的資料重複存放。
  2. 資料不一致:不必將資料搬來搬去,便解決了因 ETL 過程出錯而造成的資料不一致。
  3. 資料格式單一:Iceberg 支援讀取 結構化 (Table-like) 以及 半結構化 (Json-like) 資料,解決資料倉儲僅能儲存結構化資料的問題。
  4. Vendor-lock-in : 最後當然是受供應商箝制問題,Iceberg 可以輕易的以標準 SQL 做查詢,不必受制於特定供應商之語法,下面以 Trino query Iceberg 計算總付款金額為例:
-- 計算總付款金額
SELECT
    order_transactions.*,
    (
        SELECT
            SUM(
                COALESCE(TRY_CAST(JSON_EXTRACT(payment, '$.payment_fee.cents') AS DOUBLE), 0)
            ) AS payment_fee
        FROM
            UNNEST(order_transactions.payments) AS t(payment)
    ) AS payment_fee
FROM
    updated_data
INNER JOIN
    iceberg.datalakehouse_elt_silver.mongo_shopline_order_transactions AS order_transactions
ON
    updated_data.order_transaction_id = order_transactions.order_transaction_id
WHERE
    order_transactions.status = 'active'
    AND COALESCE(order_transactions.order_status, '') != 'temp'
    AND order_transactions._processed_at IS NOT NULL

明日預告

系列文明日《冰山不止一角,Iceberg 與 S3 (三)》,將延續前文主題,帶你走進 Trino + Iceberg on S3 的實際運作流程,同時揭開 Trino 讀取 Iceberg 的細節與秘辛。

Know me more

My Linkedin: https://www.linkedin.com/in/benny0624/
My Medium: https://hndsmhsu.medium.com/


上一篇
Day 17 - 冰山不止一角,Iceberg 與 S3 (一)
下一篇
Day 19 - 冰山不止一角,Iceberg 與 S3 (三)
系列文
動不動就要 ETL? 以Trino為例-淺談從資料倉儲到湖倉28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言